package com.zjl.redis.第02章_十大数据类型;

import com.zjl.redis.第01章_redis安装.RedisUtil;
import redis.clients.jedis.Jedis;

/**
 * Redis Stream是Redis 5.0版本新增加的数据结构。
 *
 * Redis Stream主要用于消息队列(MQ，Message Queue)，---MQ：  kafka    rabbitMQ   rocketMQ
 * Redis 本身是有一个Redis发布订阅(pub/sub)来实现消息队列的功能，
 * 但它有个缺点就是消息无法持久化，如果出现网络断开、Redis 宕机等，消息就会被丢弃。
 *
 * 简单来说发布订阅(pub/sub)可以分发消息，但无法记录历史消息。
 * 而Redis Stream提供了消息的持久化和主备复制功能，可以让任何客户端访问任何时刻的数据，
 * 并且能记住每一个客户端的访问位置，还能保证消息不丢失
 *
 */
public class B10_Stream {
    /**
     *  stream 类型    慎用！！！！！！
     * 实现消息队列，它支持消息的持久化、支持自动生成全局唯一ID、
     * 支持ack确认消息的模式、支持消费组模式等，让消息队列更加的稳定和可靠
     *
     * 一个消息链表，将所有加入的消息都串起来，每个消息都有一个唯一的 ID和对应的内容
     * 队列相关指令
     *      1. XADD key * field1 value1 [field2 value2 ...]      //添加消息到队列末尾 会自动生成一个 id并返回
     *              Redis对于ID有强制要求，格式必须是时间戳-自增Id这样的方式，且后续ID不能小于前一个ID
     *      2.XRANGE key - +  n      //获取消息列表(可以指定范围) , 忽略删除的消息 返回n条数据  第一行id 之后是值
     *      3.XREVRANGE key + - n    //和XRANGE相比区别在于反向获取，ID从大到小    + - 不可以反过来   也可以填数字 也就是自己填id
     *      4.XDEL key id         //删除指定key的指定id
     *      5.XTRIM  //限制Stream的长度，如果已经超长会进行截取
     *          XTRIM key maxlen n  //只保留key 中最大 的n个
     *          XTRIM key minid id  //删除key 中的id比此id小的
     *      6.XREAD [count n] [block milliseconds]streams key [key ...] id [id ...]
     *              //获取消息(block(阻塞)/ 默认非阻塞)，milliseconds  最大阻塞 多少毫秒 填数字
     *              //在前 n 条中（id从小到大）  返回大于id（最小0-0/000  不能用 -）的数据，每个key
     *
     *      7.XLEN key   //获取Stream中的消息长度
     *
     * 消费组相关指令
     *      1.XGROUP CREATE key 组名 id//创建消费者组 此组从指定id之后进行消费
     *      2.XREADGROUP GROUP 组名 消费人 [count n] [block milliseconds] [NOACK] streams key [key ..] id [id...]
     *          //读取指定消费者组中的消息 每个只能被消费一次无论多少消费人 消费 n条 可以阻塞
     *          [NOACK] 暂不知    的指定 key 的
     *          id用 > 就是从小到大还没被消费的 用指定id  就是查询已被消费的大于此id的
     *      3.XPENDING key 组名   //打印待处理消息的详细信息
     *          ①XPENDING key 组名 //返回指定key的指定组 已经消费 未处理
     *                  1) (integer) 2       //有几条
     *                  2) "1719226314186-0" //最小 消费的 id
     *                  3) "1719227464907-0" //最大 消费的 id
     *                  4) 1) 1) "x0"  // 消费者一
     *                        2) "2"   //消费了几条
     *                     1) 1) "x1"  // 消费者二
     *                        2) "2"   //消费了几条
     *          ②XPENDING key 组名 小id 大id n [消费者]//返回指定key的指定组已经消费未处理的 小id<=id<=大id 的n条数据  2条为例
     *                  1) 1) "1719227464907-0"  //id
     *                     2) "x0"    //消费者
     *                     3) (integer) 1024013   //已经消费了多长时间 空闲时间
     *                     4) (integer) 6   //交付次数 XREADGROUP GROUP 这个命令对指定数据进行消费时，会对消费的数据进行 +1
     *                  2) 1) "1719227467227-0"
     *                     2) "x1"
     *                     3) (integer) 428282
     *                     4) (integer) 1
     *
     *      3.XACK key 组名 id //ack消息，消息被标记为已处理” 签收指定key的指定组的指定id进行签收
     *      XGROUP SETID    设置消费者组最后递送消息的ID
     *      4.XGROUP DELCONSUMER key 组名 消费者  //删除指定key的指定消费者组的指定 消费者  返回删除个数
     *      XCLAIM    转移消息的归属权(长期未被处理/无法处理的消息,转交给其他消费者组进行处理)
     *      XINFO    打印Stream\Consumer\Group的详细信息
     *      5.XINFO GROUPS key // 打印消费者组的详细信息
     *          会打印次key的 每个组的详细信息  如 组名，有几个消费者，消费了几个了 ，消费到那个了，处理了几个了等
     *      6.XINFO STREAM key     //打印Stream的详细信息
     *          会返回长度  有几个分组 第一条数据  最后一条数据 等等
     *
     * 四个特殊符号
     *      - +     最小和最大可能出现的Id
     *      $      $表示只消费新的消息，当前流中最大的id,可用于将要到来的信息
     *      >     用于 XREADGROUP 命令，表示迄今还没有发送给组中使用者的信息，会更新消费者组的最后ID
     *      *     用于 XADD 命令中，让系统自动生成id
     *
     */
    public static void main(String[] args) {

        Jedis jedis = RedisUtil.getRedis();
        System.currentTimeMillis();//获取当前时间戳
        System.out.println(jedis.ping());//查看是否连接成功  PONG:成功

        jedis.close();
    }
}
